package com.air.mapper;


import com.air.annotation.AutoFill;
import com.air.dto.AirLinePageQueryDTO;
import com.air.entity.AirLine;
import com.air.enumeration.OperationType;
import com.air.vo.AirLineVO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface AirLineMapper {

    /**
     * 注册一个新的航空公司信息到数据库。
     *
     * 通过@Insert注解指定了插入航空公司的SQL语句，该语句用于将航空公司的各项信息
     * 插入到airline表中。@AutoFill注解用于自动填充创建时间和更新时间。
     *
     * @param airline 包含航空公司信息的对象，其属性将被插入到数据库对应的字段中。
     */
    @Insert("insert into airline(name, username, password, phone, address, id_number, create_time, update_time) " +
            "VALUES " +
            "(#{name},#{username},#{password},#{phone},#{address},#{idNumber},#{createTime},#{updateTime})")
    @AutoFill(value = OperationType.INSERT)
    void insert(AirLine airline);


    /**
     * 根据用户名查询航空公司的详细信息。
     *
     * 这个方法通过MyBatis的注解方式定义了一个SQL查询，其目的是在数据库中根据提供的用户名查找对应的航空公司信息。
     * 查询的结果将映射为AirLine对象返回。
     *
     * @param username 查询所使用的用户名。
     * @return 返回匹配用户名的航空公司的AirLine对象。如果没有找到匹配的记录，返回null。
     */
    @Select("select * from airline where username=#{username}")
    AirLine getByUsername(String username);


    /**
     * 分页查询航班信息
     *
     * 本方法通过接收AirLinePageQueryDTO对象作为参数，实现对航班信息的分页查询。
     * AirLinePageQueryDTO对象包含了查询条件和分页信息，例如航班号、出发地、目的地等查询条件，
     * 以及页码和每页大小等分页信息。
     *
     * @param airLinePageQueryDTO 航班信息的查询条件和分页信息，包括航班号、出发地、目的地等查询条件，
     *                            以及页码和每页大小等分页信息。
     * @return 返回分页查询结果，包含查询到的航班信息和分页相关信息，如总页数、总记录数等。
     */
    Page<AirLineVO> pageQuery(AirLinePageQueryDTO airLinePageQueryDTO);


    /**
     * 根据指定的ID查询航空公司的详细信息。
     *
     * @param id 航空公司的唯一标识符。
     * @return 返回匹配ID的航空公司的详细信息VO（Voice of Object）。
     *
     * 此方法使用MyBatis的注解@Select来指定SQL查询语句，
     * 通过#{id}占位符的方式动态插入ID值，以获取对应的航空公司数据。
     */
    @Select("select * from airline where id=#{id}")
    AirLineVO getById(Long id);


    /**
     * 修改航班信息。
     *
     * 该方法用于更新航空公司的航班数据。通过接收一个AirLine对象作为参数，
     * 对现有航班信息进行更新。更新操作的类型通过@AutoFill注解指定为UPDATE，
     * 以自动填充操作类型字段。
     *
     * @param airLine 包含待更新航班信息的AirLine对象。
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(AirLine airLine);

}
